#析构函数
#__init__()构造函数 __魔法方法 通常用来做属性初始化或赋值操作
#创建对象时，python解释器默认会调用


#__del__()析构函数 ---删除对象，python解释器默认会调用的方法
'''
析构函数用于在对象被清除后，清除它所占用的内存空间。
作用：主要用于对那些长期占用内存的临时变量进行销毁。
'''
#注意事项
'''
1.构造函数和析构函数一样，不能有返回值；
2.析构函数不能有参数；
3.一个类只有一个析构函数；
4.析构函数在对象被销毁时被调用。
'''
#__del__方法：  析构方法__del__是对象在被垃圾回收的时候起作用的一个方法，它的执行一般就意味着对象不能继续引用，回收内存。

'''
#例1：当对象在某个作用于中调用完毕，在跳出其作用域时，析构函数会被调用一次，用于释放内存空间。
class Person:
    def __init__(self):       #构造函数
        print('我是init方法')
    def __del__(self):        #析构函数（会在程序最后被执行）
        print('被销毁了')     

#创建对象
xm = Person()
print('最后一句')
print('最后一句')
print('最后一句')
def funa():
    print(123)
funa()
'''
#例2
class Person:
    def __init__(self):       #构造函数
        print('我是init方法')
    def __del__(self):        #析构函数
        print('被销毁了')     

#创建对象
xm = Person()
del xm        #手动删除对象（会使析构函数被提前执行）
print('最后一句')
print('\n')


#拓展：
#__str__()函数---能够在输出对象变量时，打印自定义的内容
'''
注意：
1.__str__()必须返回一个字符串
2.定义了__str__()方法，在打印对象，默认输出该方法的返回值。
'''
#例1
class A:
    def __str__(self):
        return 'hello'
obj = A()   #创建对象
print(obj)  #hello
print('\n')

#例2
class Human:
    mind = '哈哈哈'
    def __init__(self,name,age):
        self.name = name
        self.age  = age

    def work(self):
        print(f'你的名字是{name}')

    def __str__(self):
        return '你的名字是%s，年龄是%d岁'%(self.name,self.age)
    
obj = Human('Ls',20)
print(obj)



